void test_args(long a1, long *a1p, //rdi, rsi
                int a2, long *a2p, //edx, rcx
                short a3, long *a3p, //r8w, r9
                char a4, long *a4p) // %rsp+8, %rsp+16
                // 注意： 通过栈来传递参数的时候， 
                // 所有数据大小 都是向8对齐的
                // 虽然变量a4只占用一个字节，但是会为他分配8个字节的空间
                // 所以距离栈顶指针的距离分别是8 16
{
    a1p += a1;
    a2p += a2;
    a3p += a3;
    a4p += a4;
    printf("%x\n%x\n%x\n%x\n%x\n%x\n%x\n%x\n", a1, a1p, a2, a2p, a3, a3p, a4, a4p );
}

/*

gcc -Og -c  test_args.c
objdump -d test_args.o

*/